import Vue from 'vue'
import store from './index.js'
import utils from './util.js'

// 接口请求域名,部分接口是8082端口
let baseUrl = 'https://n.gac.kim'
// 公用header
let headers = {
	'Content-Type': 'application/json'
}

/**
 * 封装get请求,统一处理一些公共的错误返回
 * @param {String} url - 请求链接,如果发现url没有http,则会在前面补上baseUrl
 * @param {JSON} [data={}] - 请求参数
 * @param {JSON} [customHeader={}] - 自定义的header
 */
let normalGet = (url, data = {}, customHeader = {}) => {
	let domain = url.indexOf('http') == 0
	let _headers = {
		...headers,
		...customHeader
	}
	let longUrl = url.indexOf('http') == 0 ? url : baseUrl + url
	return uni.request({
		url: longUrl,
		data: data,
		method: 'GET',
		header: _headers
	}).then(resp => {
		let [err, res] = resp
		if (err || res.statusCode !== 200) {
			uni.showToast({
				icon: 'none',
				title: '网络异常，请稍后重试',
				position: 'bottom'
			})
			return {
				data: {
					code: '',
					data: null,
					msg: '网络异常，请稍后重试'
				}
			}
		}
		console.log(longUrl, res.data, new Date)
		return res.data
	})
};

/**
 * 封装get请求,用于请求天姬的接口
 * @param {String} url - 请求链接,如果发现url没有http,则会在前面补上baseUrl
 * @param {JSON} [data={}] - 请求参数
 * @param {JSON} [customHeader={}] - 自定义的header
 * @param {Boolean} [updateStore=true] - 是否更新store数据（目前会更新userInfo）
 */
let get = (url, data = {}, customHeader = {}, updateStore = true) => {
	let domain = url.indexOf('http') == 0
	let _headers = {
		...headers,
		...customHeader
	}
	// 2020/03/05 按老大要求加入一些判断
	if (!url.includes('?')) {
		url = '/haoka?' + url
	}
	let longurl = (domain ? '' : baseUrl) + url
	// if (!domain) {
	let aid = utils.fungetaid()
	console.log('get aid', aid)
	longurl = utils.getUrl('ymaid', aid, longurl)
	// }

	let logs = utils.getUrlParam('logs');

	let uri = JSON.parse(utils.getv('uri', '{}', longurl))

	// 根据平台设置platform参数
	if(window.location)if(window.location.href.indexOf('localhost')>0)logs=1;
	uri.platform = 'h5'
	// 重新把uri放回url里
	longurl = utils.getUrl('uri', JSON.stringify(uri), longurl)
	//if(logs)
	longurl = utils.getUrl('logs', 1, longurl)
	console.log(longurl, data, new Date)

	return uni.request({
		url: longurl,
		data: data,
		method: 'GET',
		header: _headers
	}).then(resp => {
		let [err, res] = resp
		if (err || res.statusCode !== 200) {
			uni.showToast({
				icon: 'none',
				title: '网络异常，请稍后重试',
				position: 'bottom'
			})
			return {
				data: {
					code: '',
					data: null,
					msg: '网络异常，请稍后重试'
				}
			}
		}
		// 2020/03/05 按老大要求加入对jpn的解析
		if (res.data.indexOf('jpn') == 0) {
			res.data = utils.jpn2json(res.data)
		}
		console.log('===get=', res.data, new Date)
		if (res.data.msg) {
			uni.showToast({
				icon: 'none',
				title: res.data.msg
			})
		}
		// 如果有传回_my和_MY，更新store.userInfo
		if (updateStore && res.data._my && res.data._MY) {
			store.commit('updateUserInfo', {...res.data._my[0], ...res.data._MY[0]})
		}

		return res.data
	})
};

/**
 * 封装post请求,统一处理一些公共的错误返回
 * @param {String} url - 请求链接,如果发现url没有http,则会在前面补上baseUrl
 * @param {JSON} [data={}] - 请求参数
 * @param {JSON} [customHeader={}] - 自定义的header
 */
let post = (url, data = {}, customHeader = {}) => {
	let domain = url.includes('http')
	let _headers = { ...headers,
		...customHeader
	}
	return uni.request({
		url: (domain ? '' : baseUrl) + url,
		data: data,
		method: 'POST',
		header: _headers
	}).then(data => {
		let [err, res] = data;
		if (err || res.statusCode !== 200) {
			uni.showToast({
				icon: 'none',
				title: '网络异常，请稍后重试',
				position: 'bottom'
			})
			return {
				data: {
					code: '',
					data: null,
					msg: '网络异常，请稍后重试'
				}
			}
		}
		return res.data
	});
}

let wxinit = 0
let wxShareData = {
	title: document.title,
	desc: document.title,
	link: document.location.href,
	imgUrl: '',
	dataUrl: '',
	success: ''
}


/**
 * 安全地调用js-sdk接口（包括确保wx.config已调用、微信客户端支持调用的接口）
 * @param {String|Array.<String>} apiName - 调用接口名（或数组），有传则用wx.checkJsApi检测当前环境是否可用改接口，不传则不检测
 * @param {Function} onsuccess - 确保可执行api时调用
 * @param {Function} [onfail=onsuccess] - 不能执行api时调用，不传则默认与onsuccess为统一方法（当然这样容易报错）
 */
async function safeWxApi(apiName, onsuccess, onfail) {
	console.log("进入safeWxApi");
	onfail = onfail || onsuccess;
	let todo = function() {
		wx.ready(function() {
			wxinit = 1;
			if (apiName) {
				let apiList = [].concat(apiName);
				wx.checkJsApi({
					jsApiList: apiList,
					success: function(res) {
						apiList.every(function(api) {
							return res.checkResult[api];
						}) ? onsuccess && onsuccess() : onfail && onfail();
					}
				});
			} else {
				onsuccess && onsuccess();
			}
		});
	};
	if (!wxinit) { // 微信未初始化，则进行初始化
		// 请求get_config获取签名等wx.config所需的参数
		console.log("通过db.jp请求/wx/get_config接口")
		let res = await get('https://n.gac.kim/wx/get_config?projName=haoka&url=' + encodeURIComponent(location.href.split(
			'#')[0]))
		console.log('safeApi', res)
		if (typeof res == 'string') {
			res = JSON.parse(res.substring(4, res.length - 1))
		}
		if (res.error) {
			console.log('请求get_config出错，err：' + res.msg + ' in 微信分享')
			onfail && onfail()
		} else {
			console.log('准备调用wx.config，参数：' + JSON.stringify(res.msg))
			wx.config(res.msg)
			todo()
			wx.error(function(res) {
				wxinit = 0
				console.error('微信js-sdk出错，res：' + JSON.stringify(res))
				onfail && onfail()
			})
		}
	} else {
		todo();
	}
}
/**
 * 设置微信分享中的标题、分享链接、分享内容、分享图标
 * @param {String} [title=wxShareData.title] - 分享标题 
 * @param {String} [desc=wxShareData.desc] - 分享描述
 * @param {String} [link=wxShareData.link] - 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
 * @param {String} [imgUrl=wxShareData.imgUrl] - 分享图标
 * @param {String} [type='link'] - 分享类型,music、video或link
 * @param {String} [dataUrl=''] - 如果type是music或video，则要提供数据链接，默认为空
 * @param {String} [success=''] - 用户点击了分享后执行的回调函数（将被eval）
 * @param {Array.<String>} [clearList=['code','uri']] - 获取连接的T.getUrl里的参数，具体查看T.getUrl
 */
async function wx_share(aj) {
	let errmsg = ''
	typeof(wx) == 'undefined' && (errmsg = '依赖文件http://res.wx.qq.com/open/js/jweixin-1.2.0.js未加载 in api.wx_share')
	!utils.isWechat() && (errmsg = '非微信环境，微信分享调用失败 in api.wx_share')
	if (errmsg) {
		console.log(errmsg)
		return 0
	}
	wxShareData = wxShareData || {} // 确保wxShareData存在
	let a = { ...{
			title: wxShareData.title,
			desc: wxShareData.desc,
			link: wxShareData.link,
			imgUrl: wxShareData.imgUrl,
			type: 'link',
			dataUrl: '',
			success: wxShareData.success
		},
		...aj
	}
	wxShareData = Object.assign({}, a); // 浅复制一份到wxShareData
	console.log("开始调用safeWxApi", a);
	safeWxApi(['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo'], function() {
		console.log("safeApi调用完毕")
		wx.onMenuShareTimeline(a);
		wx.onMenuShareAppMessage(a);
		wx.onMenuShareQQ(a);
		wx.onMenuShareWeibo(a);
	})
	return 1;
}

// 请求获取支付签名
// @param {Object} - json
// 		@param {Number} [json.rmb=1] - 支付金额
// 		@param {String} [json.type='充值'] - 支付类型，用于分类支付用途
async function wx_paySign(json) {
	json.rmb = json.rmb || 1
	json.type = json.type || '充值'
	let paramsStr = JSON.stringify(json)
	let res = await get(`/haoka?idc=号卡_微信支付签名&uri=${paramsStr}&logs=1`)
	return res.res
}
// 更新支付订单状态
async function wx_updatePayOrder(json) {
	let paramsStr = JSON.stringify({
		orderId: json.orderId,
		state: json.state
	})
	return await get(`/haoka?idc=号卡_微信支付完成&uri=${paramsStr}&logs=1`)
}

// 调起微信环境中的支付接口，并在支付完成（取消）后调用接口
// TODO: 成功后的状态值不应该由前端传参决定，以后要改为后端接口获取支付实际状态为准
async function wx_internalPay(signatureData) {
	return new Promise((resolve, reject) => {
		try {
			//调用微信支付窗口
			console.log("准备调用getBrandWCPayRequest，package：" + signatureData.package);
			WeixinJSBridge.invoke(
				'getBrandWCPayRequest', {
					"appId": signatureData.appid, //公众号名称，由商户传入     
					"timeStamp": signatureData.timeStamp, //时间戳，自1970年以来的秒数     
					"nonceStr": signatureData.nonceStr, //随机串     
					"package": signatureData.package,
					"signType": signatureData.signType, //微信签名方式:     
					"paySign": signatureData.paySign //微信签名 
				},
				async function(payRes) {
					console.log("微信支付回调1", payRes)
					resolve(payRes)
				}
			)
		} catch (ex) {
			console.log(ex)
			reject(ex)
		}
	})
}


// 封装获取订单接口
async function getOrders(isMe, state) {
	let paramsStr = JSON.stringify({
		isMe: isMe,
		state: state
	})
	let res = await get(`/haoka?idc=号卡_获取订单&uri=${paramsStr}`)

}

// 封装用户登录接口，（tidus为推荐人，无值时认为是进入了总店）
// 返回用户信息（号卡_用户 与 应用市场_用户 结合的用户信息）
async function h5Login(tidus) {
	let paramsStr = JSON.stringify({
		tidus: tidus || '',
		from: utils.getUrlParam('from')
	})
	let user = await get(`/haoka?idc=号卡_用户&uri=${paramsStr}`)
	return user
}

// 获取我的用户信息
async function getMyUserInfo() {
	return await get(`/haoka?idc=号卡_获取用户&uri={}&logs=1`)
}


// 将天姬的db.encode搬过来
function encode(str, f) {
	if (f) {
		str = str.replace(/\n/g, '<BR>').replace(/"/g, '``').replace(/#/g, '＃').replace(/&/g, ';amp;');
	} else {
		str = str.replace(/\n/g, '<BR>').replace(/"/g, '``').replace(/#/g, '＃').replace(/&/g, ';amp;').replace(/'/g, '\\\'');
	}
	return encodeURI(str).replace(/\+/g, '%2b');
}
// 将天姬的db.sajax搬过来
/**
 * @method sajax
 * @param  {[string]} t     表名，多表用|分隔
 * @param  {[string]} q     获取或者修改的字段,用|分隔
 * @param  {[string]} w     获取或者修改的条件,用|分隔
 * @param  {[string]} a     权字段,用|分隔,以下abc...表示第N位数,常用只用第一位数
 * @param  {[string]} a.a   第一位字是1 如果条件不为空时，数据库中查询不到数据则自动插入，有则修改;<br>2 不同的ssql方式插入;<br> 3 新增前先寻找f=-3的记录 
 * @param  {[string]} a.b  funrea中取出本表字段名,用于实现分组，游戏中基本不需要用    
 * @param  {[string]} a.c  =1 不进行写入前验证(wr中的限制不起作用),2读取wr中的条件    
 * @param  {[string]} a.d  =1 不执行触发
 * @param  {[string]} a.e  =1 group by 是返回 count(*)等统计值
 * @param  {[string]} a.f  =1 json如无数据，则返回空
 * @param  {[function]} func  回调函数
 * @param  {[type]} arg   主要用于option,以下abc...表示第N位数,默认&option=001
 * @param  {[type]} arg.a  =1 oracle数据库
 * @param  {[type]} arg.b  =1 显示调试信息=1
 * @param  {[type]} arg.c  all中插入sx
 * @param  {[type]} notqx  1
 * @return {[type]}  取决于回调函数
 * @example
 * <br>-----一般查询--------<br>
 *db.sajax('fs@2',"all",'idfl='+s_fid+" and ctn='tbq' and f1>0","",function(ii,jsona){
 *<br>maxr表示获到的记录数
 *<br>    if(jsona['fs@2'].a.maxr>0&&jsona['fs@2'].a.maxr<5){
 *<br>      //亲,接龙失败，已经被人捷足先登，您可以发起龙头
 *<br>       
 *<br>     }
 *<br> },'&option=011', 1); 
 *<br>-----关联查询--------<br>
 *<br>db.sajax('fs|fl@2', 'all:idus|(idus)all', "idfl in("+s_fid+") and f1>0|idus in({0}) and f1>0 and ctn='rd' and idcm="+idcm, "||", function(i, json){
 * <br>  //:idus表示为下一个查询提供外键，与idus in({0})结合使用。高级用法all:idus:idus2:idus3,与idus in({0}),idus in({1}),idus in({2})
 * <br> (idus)表示查出表中的以idus作为主键，使用的时候就可以通过fs中记录的idus，获取fl@2当中的数据
 * <br>j.each(json["fs"].all, function(k, n){ 
 *  <br>             
 *  <br> var puidname = json["fl@2"].all[n.idus].cwxn;
 * <br> },'&option=011', 1); 
 * <br>-----数据插入修改--------
 * <br>db.sajax('fs', 'fs='+_score+',idcm='+idcm+',idfl='+s_fid+',idus='+db.idus+",ctn='tbq'", 'idfl='+s_fid+' and idus='+db.idus+" and ctn='tbq' ", "1", function(i, json){
 * <br>
 * <br>},'&option=011', 1); 
 * <br>-------------<br>
 */
async function sajax(t, q, w, a, func, arg, notqx) {
	if (notqx == null)
		// if (db.qx(1) != '') return;
	arg = arg || '&option=001';
	var s = '';
	var ta = t.split('|');
	var qa = q.split('|');
	var wa = w.split('|');
	var aa = a.split('|');

	qa.forEach((n, i) => {
		if (ta.length > i) s += '&t' + i + '=' + ta[i];
		s += '&q' + i + '=' + encode(qa[i], 1).replace(/\=/g, '7fs39').replace(/\,/g, '7g2j9');
		if (wa.length > i) s += '&w' + i + '=' + encodeURI(wa[i]).replace(/\+/g, '%2b');
		if (aa.length > i) s += '&a' + i + '=' + aa[i];
	})
	// j.each(qa, function(i, n) {
	// 	if (ta.length > i) s += '&t' + i + '=' + ta[i];
	// 	s += '&q' + i + '=' + db.encode(qa[i], 1).replace(/\=/g, '7fs39').replace(/\,/g, '7g2j9');
	// 	if (wa.length > i) s += '&w' + i + '=' + encodeURI(wa[i]).replace(/\+/g, '%2b');
	// 	if (aa.length > i) s += '&a' + i + '=' + aa[i];
	// });
	var idpg = 1196
	var url = 'db.jsp?idpg=' + idpg + '&n=' + qa.length + s + arg;
	var data = "";
	var domain = 'www.kxtui.com'
	if ((window.location + '').indexOf(domain) == 7 && (window.location + '').indexOf('urltypeget') == -1) { //同服可用post
		data = 'idpg=' + idpg + '&n=' + qa.length + s + arg; //提示超长，实际不会
		url = '/db.jsp';
	}

	let res = await normalGet('https://www.kxtui.com/' + url)
	res = utils.jpn2json(res)
	console.log('sajax', res)
	return res
	// func && func()
	// db.jp(url, func, {}, data);
};

// 将天姬的jex的IsMobileNumSer搬过来，识别手机号的地区及运营商
/**
 * @method isCardNo
 * @description 检测手机号码等的归属地及运营商类别
 * @param  json  
 * @param  json.ctel 电话号码
 * @param  json.func 回调
 * @param  json.op 0无须进行匹配检测，1根据内容进行判断
 * @param  json.lx 0,不判断结果，1检测是否为移动，2检测联通，3检测是否为电信号码，默认0
 * @param  json.cma 需匹配的区域名，默认为空，不检测，"广东" "北京" "广东市"，省（直辖市）为两个字，如果是省下级市，直接输入三个字，“广州市” 
 * @return json 返回数据，{result:1,lx:0,data:{}}  返回数据，result:表示检测结果（符合条件或者不符合,-1表示没有数据返回），lx:0未知，1移动，2联通，3电信，data:表示从数据库中获得的数据
 * @example
 * j().isCardNo();
 */
async function IsMobileNumSer(jsons) {
	var ctel = jsons.ctel || "";
	if (ctel.length < 7) {
		alert("手机号码不正确");
		return;
	}
	// var querCtel = ctel.substring(0, 7);
	// let res = await sajax("mobiles|mobilessp", "all|all", "cmb='" + querCtel + "'|mb=" + querCtel + " or mb=" + ctel, "")
	let paramsStr = JSON.stringify(jsons)
	let res = await get(`/haoka?idc=号卡_获取手机地区&uri=${paramsStr}&logs=1`)
	let ret = {}
	if (res.mobiles.a.maxr > 0) {
		let key = res.mobiles.all.sx[0]
		ret = res.mobiles.all[key]
	}
	return ret
}

export default {
	normalGet,
	get,
	post,

	// wx_share,
	// wx_paySsign,
	wx_updatePayOrder,
	// wx_pay,
	// wx_getCode,

	h5Login,
	// code2session,
	// wxmpLogin,
	getMyUserInfo,
	// shareSuccess,
	
	IsMobileNumSer
}
